<?php

/**
 * 文件、目录操作类
 * @package  htdocs
 * @subpackage  module/base
 * @version 1.0
 */

class fileDirHandler {


    /**
     * @var $dirName 目录名
     */
    protected $dirName;

    /**
     * @var $fileName 文件名
     */
    protected $fileName;

    /**
     * @var $ctime 文件创建时间
     */
    protected $ctime;

    /**
     * @var $mtine 文件最后修改时间
     */
    protected $mtime;

    /**
     * @var $fileContent 文件内容
     */
    protected $fileContent;

    /**
     * @var $mtine 文件最后访问时间
     */
    protected $atime;

    /**
     * @var $G_PGLOB ebsig全局对象
     */
    protected $G_PGLOB;

    function __construct( $G_PGLOB = null ) {

        if (!is_null($G_PGLOB)) {
            $this->G_PGLOB = $G_PGLOB;
        }

    }

    public function init( $name ) {

        if (is_file($name)) {
            $this->fileName = $name;
            $this->ctime = $this->getFileTime( 'c' );
            $this->mtime = $this->getFileTime( 'm' );
            $this->atime = $this->getFileTime( 'a' );
        } else {
            $this->dirName = $name;
        }

    }

    /**
     * 取得文件相关时间
     * @param string $flg 选择不能类型时间的符号（a, c, m等）
     * @return bool|string
     */
    private function getFileTime( $flg ) {

        switch( $flg ) {

            case 'c': //文件创建时间
                return date( G_DEFAULT_DATETIME_FORMAT, filectime( $this->fileName ) );
                break;

            case 'm': //文件修改时间
                return date( G_DEFAULT_DATETIME_FORMAT, filemtime( $this->fileName ) );
                break;

            case 'a': //文件最后访问时间
                return date( G_DEFAULT_DATETIME_FORMAT, fileatime( $this->fileName ) );
                break;

            default:
                return false;
                break;

        }

    }

    /**
     * 获得文件创建时间
     * @return bool|string
     */
    public function getctime() {
        return $this->ctime;
    }

    /**
     * 获得文件修改时间
     * @return bool|string
     */
    public function getmtime() {
        return $this->mtime;
    }

    /**
     * 获得文件最后访问时间
     * @return bool|string
     */
    public function getatime() {
        return $this->atime;
    }

    /**
     * 修改文件内容
     * @param $fileContent
     */
    public function setFileContent( $fileContent ) {
        $this->fileContent = $fileContent;
    }

    /**
     * 获得文件内容
     * @return string
     */
    public function getFileContent() {

        $fileContent = file_get_contents( $this->fileName );

        $this->setFileContent( $fileContent );

        return $fileContent;

    }

    /**
     * 保存文件内容
     * @return bool
     */
    public function saveFileContent() {

        $fileName_bak = $this->fileName . ".bak_" . date ( 'YmdHis' );
        copy ( $this->fileName, $fileName_bak );
        if (! file_put_contents ( $this->fileName, $this->fileContent, LOCK_EX ) )
            return false;
        return true;

    }

    /**
     * 更新集群服务器的文件
     * @return bool
     */
    public function publishall() {

        // 应用服务器集群定义
        $APP_SERVER_POOL = array(
            '10.221.132.140' => 8120,
            '10.221.124.103' => 8120,
            '10.221.124.102' => 8120
        );

        //签名算法
        $sign_time = date ( 'HismdY' );
        $sign_key = 'CONFIG_by_MEMCACHE';
        $sign_ver = '2.3';
        $sign = md5 ( $sign_time . $sign_ver . $sign_key );

        //存入到redis里
        $this->G_PGLOB->sessionCache_set($sign, array ($this->fileName, $this->fileContent ), 360000, true);

        //同步更新所有应用服务器
        $error_counter = 0;
        foreach ( $APP_SERVER_POOL as $server_ip => $server_port ) {
            //初始化网络调用
            $url = sprintf ( 'http://%s:%s/app_innercall/updateconfig.php?ver=%s&sign1=%s&sign2=%s', $server_ip, $server_port, $sign_ver, $sign, encryptD ( $sign_time ) );
            $curl_handler = curl_init ();
            curl_setopt ( $curl_handler, CURLOPT_URL, $url );
            curl_setopt ( $curl_handler, CURLOPT_HEADER, false );
            curl_setopt ( $curl_handler, CURLOPT_RETURNTRANSFER, true );
            $curl_result = curl_exec ( $curl_handler );
            if ($curl_result === false) {
                $error_counter ++;
                continue;
            }
            $curl_http_status = curl_getinfo ( $curl_handler, CURLINFO_HTTP_CODE );
            if ($curl_http_status != 200)
                $error_counter ++;
            curl_close ( $curl_handler );
        }
        $this->G_PGLOB->sessionCache_remove ( $sign, true );

        return $error_counter == 0;

    }

    /**
     * 移动文件或文件夹
     * @param string $oldName 旧的文件或文件夹路径
     * @param string $newName 新的文件或文件夹路径
     * @return bool
     */
    public function move($oldName, $newName) {
        return rename($oldName, $newName);
    }

    public function basename( $filePath ) {
        return basename( $filePath );
    }

    public function unlink ( $filename ) {
        if (file_exists( $filename )) {
            return @unlink( $filename );
        } else {
            return false;
        }
    }

	/**
     * 读取文件内容
     * @param int $row 从第几行开始读，默认第一行
     * @return array
     */
    public function reader( $row = 1) {

        //加载phpexcel相关类
        quanli_include('framework/phpExecl/PHPExcel.php');
        quanli_include('framework/phpExecl/PHPExcel/Reader/Excel2007.php');

        //实例phpexcel了哦
        $PHPExcel = new PHPExcel();

        //实例reader类
        $PHPReader = new PHPExcel_Reader_Excel2007();

        //检查是否可以读取文件内容
        if (!$PHPReader->canRead($this->fileName)) {
            return array( 'code' => 404, 'message' => '文件读取失败，请检查文件是否是xlsx文件' );
        }

        //设置超时时间和文本大小
        ini_set('max_execution_time', 1800);
        ini_set('memory_limit', '512M');


        //加载文件内容
        $PHPExcel = $PHPReader->load($this->fileName);

        /**读取excel文件中的第一个工作表*/
        $currentSheet = $PHPExcel->getSheet(0);

        /**取得一共有多少行*/
        $allRow = $currentSheet->getHighestRow();

        $data_array = array();

        if ($allRow >= $row) {

            /**取得最大的列号*/
            $allColumn = $currentSheet->getHighestColumn();

            for($currentRow = $row; $currentRow <= $allRow; $currentRow++) {

                $temp_array = array();

                /**从第A列开始输出*/
                for ($currentColumn= 'A'; $currentColumn <= $allColumn; $currentColumn++) {
                    $val = $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65, $currentRow)->getValue();/**ord()将字符转为十进制数*/
                    $temp_array[] = $val;
                }

                $data_array[] = $temp_array;

            }

        } else {

            return array( 'code' => 404, 'message' => '文件内容为空，读取失败' );

        }

        //恢复到初始状态
        ini_restore('max_execution_time');
        ini_restore('memory_limit');

        return array( 'code' => 200, 'message' => 'ok', 'data' => $data_array );

    }

}